import axios from 'axios';
import { ElMessage } from 'element-plus';

// 创建axios实例
const request = axios.create({
  // 移除 baseURL,使用相对路径配合 Vite 代理
  timeout: 30000, // 请求超时时间
});

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 确保localStorage访问是安全的（在某些环境中可能被限制）
    let token;
    try {
      token = localStorage.getItem('token');
    } catch (e) {
      console.warn('获取token失败:', e);
      token = null;
    }
    
    // 如果有token，添加到请求头
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    
    // 确保JSON请求的Content-Type正确
    if (config.method === 'post' || config.method === 'put') {
      if (!config.headers['Content-Type'] && typeof config.data === 'object') {
        config.headers['Content-Type'] = 'application/json';
      }
      
      // 如果是应用上下文类型，不要自动序列化数据
      if (config.headers['Content-Type'] === 'application/json' && typeof config.data === 'object' && !(config.data instanceof FormData)) {
        // 打印请求数据便于调试
        console.log('请求数据:', JSON.stringify(config.data));
      }
    }
    
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  response => {
    // 记录所有响应，便于调试
    if (response.config.url.includes('/comments/')) {
      console.log(`API响应 ${response.config.url}:`, response.data);
    }
    
    return response.data;
  },
  error => {
    if (error.response) {
      // 处理权限错误
      if (error.response.status === 403) {
        ElMessage.error('没有权限访问该功能');
        return Promise.reject(error);
      }
      
      // 处理认证失败
      if (error.response.status === 401) {
        ElMessage.error('登录已过期，请重新登录');
        // 清除本地存储的token和用户信息
      localStorage.removeItem('token');
      localStorage.removeItem('userInfo');
        // 重定向到登录页
      window.location.href = '/login';
        return Promise.reject(error);
      }
      
      // 其他错误
      ElMessage.error(error.response.data?.message || '请求失败');
      return Promise.reject(error);
    }
    
    // 网络错误
    if (error.request) {
      ElMessage.error('网络错误，请检查网络连接');
      return Promise.reject(error);
    }
    
    // 其他错误
    ElMessage.error('请求失败');
    return Promise.reject(error);
  }
);

export default request;
